/*
 * Copyright (c) 2020 hebeiyiliuba.com
 * All rights reserved.
 *
 */
package org.jeecg.modules.middleware.quartz.job.djtax;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.jeecg.common.util.DateUtils;
import org.jeecg.modules.third.dongjiang.tax.system.constant.enums.PersonalIncomeTaxEnum;
import org.jeecg.modules.wlhy.company.entity.HyCompany;
import org.jeecg.modules.wlhy.company.entity.HyCompanyConfig;
import org.jeecg.modules.wlhy.company.service.IHyCompanyConfigService;
import org.jeecg.modules.wlhy.company.service.IHyCompanyService;
import org.jeecg.modules.wlhy.hyconfig.entity.HyConfig;
import org.jeecg.modules.wlhy.hytaxperincomedet.entity.HyTaxPerincomedet;
import org.jeecg.modules.wlhy.hytaxperincomedet.service.IHyTaxPerincomedetService;
import org.jeecg.modules.wlhy.hytaxpersonalincome.entity.YssrTotalDTO;
import org.jeecg.modules.wlhy.hytaxpersonalincome.service.IHyTaxPersonalincomeService;
import org.jeecg.modules.wlhy.utils.HyConfigUtils;
import org.quartz.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;

import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

/**
 *个人所得税汇总信息
 *
 * @author duanlikao
 * @created 2021/3/20
 */
@PersistJobDataAfterExecution
@DisallowConcurrentExecution
public class PerincomedetJob implements Job {

    private static final Logger LOGGER = LoggerFactory.getLogger(PerincomedetJob.class);

    public SimpleDateFormat now = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    /**
     * 申报企业信息
     */
    @Autowired
    private  IHyCompanyService companyService;



    /**
     * 车主个税明细申报信息
     */
    @Autowired
    private IHyTaxPersonalincomeService taxPersonalincomeService;


    /**
     * 车主个税汇总申报信息
     */
    @Autowired
    private IHyTaxPerincomedetService taxPerincomedetService;

    @Autowired
    private IHyCompanyConfigService companyConfigService;


    /**
     * 个人所得税汇总信息
     */
    //@Scheduled(cron = "0 0 0 * * ?")//每天凌晨执行一次
//    @Scheduled(cron =  "0 */5 * * * ? ")//每5分中执行一次
//    @Scheduled(cron = "0 30 0 * * ?")//每天的00:30:00执行
//    @Scheduled(cron =  "0 */15 * * * ? ")//每15分中执行一次
//    @Scheduled(cron = "0 30 12 8 * ?")//每月1号的01:10:00执行
//    @Scheduled(cron = "0 40 15 17 * ?")//每月1号的01:10:00执行
//    @Scheduled(cron = "0 01 13 6 * ?")//每月1号的01:10:00执行
//    @Scheduled(cron = "0 40 09 28 * ?")//每月1号的01:10:00执行

    //@Scheduled(cron = "0 10 1 3 * ?")//每月3号的01:10:00执行
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {

        HyConfig systemConfig = HyConfigUtils.getConfig();
        if(systemConfig == null || !systemConfig.getDongjiangIzUse()){
            LOGGER.info("天津东疆税务上报服务暂未开启,请联系管理员。" );
            return;
        }


        String[]  dateTime = getDateTime().split("=");
        Date startTime =  DateUtils.stringToDateTime(dateTime[0]);
        Date endTime = DateUtils.stringToDateTime(dateTime[1]);

        //申报公司：河北一六八网络科技有限公司天津第二分公司

        List<HyCompanyConfig> companyConfigs = companyConfigService.list(new QueryWrapper<HyCompanyConfig>()
                .eq("tax_upload_type", 1)
                .eq("tj_tax_upload_status","1")
        );
        if(CollectionUtils.isEmpty(companyConfigs)) {
            LOGGER.info("DriverDeclareStat savePerincomedet: 没有分公司配置税务上报 !" );
            return;
        }
        long start = System.currentTimeMillis();
        LOGGER.info("DriverDeclareStat savePerincomedet:执行统计数据开始" + now.format(new Date()));

        for (HyCompanyConfig companyConfig : companyConfigs) {

            HyCompany company   = companyService.getById(companyConfig.getCompanyId());
            for(int i =1; i<=5 ;i++){
                if(PersonalIncomeTaxEnum.isValid(i)){

                    HyTaxPerincomedet hyTaxPerincomedet = new HyTaxPerincomedet();
                    hyTaxPerincomedet.setSkssqq(startTime);// 是 税款所属期起
                    hyTaxPerincomedet.setSkssqz(endTime);// 是 税款所属期止
                    hyTaxPerincomedet.setSbrq(new Date());// 是 申报日期

                    hyTaxPerincomedet.setNsrsbh(company.getCreditCode());// 是 扣缴义务人识别号（平台 企业-纳税人社会信用代 码）
                    hyTaxPerincomedet.setNsrmc(company.getCompanyName());// 是 扣缴义务人名称（平台企 业-纳税人名称）
                    //  税率（5%、10%、20%、30%、 35%）（以个税明细申报表为基础，按税率进行汇 总）
                    BigDecimal tjsl = new BigDecimal(PersonalIncomeTaxEnum.getSlBycode(i));
                    hyTaxPerincomedet.setSl(tjsl.setScale(2, BigDecimal.ROUND_DOWN)
                    );
                    YssrTotalDTO  yssrTotalDTO = getYssrTotalBySl(tjsl ,startTime,endTime);
//                    LOGGER.info("DriverDeclareStat savePerincomedet yssrTotalDTO:{} ,tjsl:{} ,startTime:{},endTime:{} " ,yssrTotalDTO ,tjsl ,startTime,endTime);
                    if(yssrTotalDTO != null){
                        //  申报人数
                        hyTaxPerincomedet.setSbrs(
                                StringUtils.isNotEmpty(yssrTotalDTO.getSbrs()) ? yssrTotalDTO.getSbrs(): "0"
                        );
                        //  应税收入汇总中的所有数值均以明细汇总而来，汇总以税率进行区分，同税率的进行汇总，
                        //  例如： 假设税率=5%，那么： 5%汇总的 yssr = 5%明细 1 的 yssr + 5%明细 2 的 yssr。 以此类推。
                        BigDecimal yssr =  yssrTotalDTO.getYssr()!= null  ? yssrTotalDTO.getYssr() : BigDecimal.ZERO;
                        hyTaxPerincomedet.setYssr(yssr.setScale(2, BigDecimal.ROUND_HALF_UP));
                        // 应纳税额 (月收入/1.03*0.05 )
                        //                    Double ynse =  (yssr /1.03d) * 0.05d  ;

                        //                    Double sl  = 0.00d;
                        //                    Double sks = 0.00d;
                        //                    Map<String,String>  slAndsksMap = getSlAndsks(ynse) ;
                        //                    LOGGER.info("savePerincomedet  ynse :{},slAndsksMap :{}" ,ynse, slAndsksMap.toString());
                        //                    for(String key : slAndsksMap.keySet()) {
                        //                        sl = Double.valueOf(key);
                        //                        sks = Double.valueOf(slAndsksMap.get(key));
                        //                        break;
                        //                    }
                        //                    //应纳税额 = 应纳税额  * 速算表税率 - 速算扣除数)
                        //                    Double jsyj =  ynse * sl - sks;

                        //应纳税额 =  应代征税额 + 本期应补退税额
                        //Double jsyj = getYdzseTotal(  startTime,  endTime) +getNowBqybtseTotalBySl( tjsl,  startTime,  endTime) ;
                        BigDecimal ynse =  yssrTotalDTO.getYnse()!= null  ? yssrTotalDTO.getYnse() : BigDecimal.ZERO;

                        hyTaxPerincomedet.setYnse(ynse.setScale(2, BigDecimal.ROUND_HALF_UP)
                        );
                        // 累计已缴纳税额
                        // Double ljyjnse =  getBqybtseTotalBySl( tjsl) ;
                        BigDecimal ljyjnse =  yssrTotalDTO.getLjyjse()!= null  ? yssrTotalDTO.getLjyjse() : BigDecimal.ZERO;
                        hyTaxPerincomedet.setLjyjnse(ljyjnse.setScale(2, BigDecimal.ROUND_HALF_UP) );
                        //  本期应补退税额 = 应纳税额 - 累计已缴税额
                        // Double bqybtse = jsyj - ljyjnse  ;
                        BigDecimal bqybtse =  yssrTotalDTO.getBqybtse()!= null  ? yssrTotalDTO.getBqybtse() :BigDecimal.ZERO;

                        hyTaxPerincomedet.setBqybtse(bqybtse.setScale(2, BigDecimal.ROUND_HALF_UP)
                        );
//                        LOGGER.info("savePerincomedet hyTaxPerincomedet hyTaxPerincomedet:{}" , JSONObject.toJSONString(hyTaxPerincomedet));
                        taxPerincomedetService.save(hyTaxPerincomedet);
                    }

                }
            }
        }


        LOGGER.info("DriverDeclareStat savePerincomedet:执行统计数据结束,耗时:"+(System.currentTimeMillis()-start)+"毫秒----");
    }

    /**
     * 获取统计时间段
     * @return
     */
    private String getDateTime(){
        int lastMonth  = Calendar.getInstance().get(Calendar.MONTH);
        return DateUtils.getFirstDayOfMonth(lastMonth) +"="+DateUtils.getLastDayOfMonth(lastMonth);
        //return "2023-01-01 00:00:00=2023-01-31 23:59:59";
    }





    /**
     * 按税率和申报月份时间统计 应税收入
     * @param tjsl
     * @param startTime
     * @param endTime
     * @return
     */
    private YssrTotalDTO getYssrTotalBySl(BigDecimal tjsl, Date startTime, Date endTime){
        String tjslString =  String.valueOf(tjsl);
        if(StringUtils.isNotEmpty(tjslString)){
            String startTimeString =  DateUtils.date2Str(startTime, DateUtils.date_sdf.get());
            String endTimeString =  DateUtils.date2Str(endTime, DateUtils.date_sdf.get());
            return  taxPersonalincomeService.getYssrTotalBySl( tjslString,  startTimeString,  endTimeString);
        }
        return null;
    }





}
